7363. Сумма дробей

 

Вычислите сумму двух правильных дробей a / b и c / d. Результат представьте в виде несократимой дроби. Если в результате получается целое число, то выведите это единственное число.

 

Вход. В одной строке содержатся четыре натуральных числа  a, b, c, d – числители и знаменатели дробей. Все числа не превышают 1000.

 

Выход. Выведите числитель и знаменатель искомой дроби или целое число.

 

Пример входа 1

Пример выхода 1

1 2 1 4

3 4

 

 

Пример входа 2

Пример выхода 2

3 4 1 4

1

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Очевидно, что . Остается сократить результирующую дробь на их наибольший общий делитель.

 

Реализация алгоритма

Функция gcd возвращает наибольший общий делитель чисел a и b.

 

int gcd(int a, int b)

{

  return (!b) ? a : gcd(b,a % b);

}

 

Основная часть программы. Читаем входные данные.

 

scanf("%d %d %d %d",&a,&b,&c,&d);

 

Вычисляем результирующую дробь p / q.

 

p = a * d + c * b;

q = b * d;

 

Вычисляем НОД числителя и знаменателя. Сокращаем дробь.

 

g = gcd(p,q);

p /= g; q /= g;

 

Выводим ответ. Если ответом является целое число (знаменатель q равен 1), то выводим только числитель.

 

if (q == 1) printf("%d\n",p);

else printf("%d %d\n",p,q);

 

Реализация при помощи класса

 

#include <stdio.h>

 

class Fraction

{

private:

  int a, b;

public:

  Fraction(int a = 1, int b = 1) : a(a), b(b) {};

 

  void ReadData(void)

  {

    scanf("%d %d",&a,&b);

  }

 

  static int gcd(int a, int b)

  {

    return (!b) ? a : gcd(b,a % b);

  }

 

  Fraction operator+(const Fraction &f)

  {

    int p = this->a * f.b + f.a * this->b;

    int q = this->b * f.b;

    int d = gcd(p,q);

    return Fraction(p/d,q/d);

  }

 

  void Print()

  {

    if (b == 1) printf("%d\n",a);

    else printf("%d %d\n",a,b);

  }

};

 

int main(void)

{

  Fraction a, b, c;

  a.ReadData();

  b.ReadData();

  c = a + b;

  c.Print();

  return 0;

}

 

Python реализация

Читаем входные данные.

 

a, b, c, d = map(int, input().split())

 

Вычисляем результирующую дробь p / q.

 

p = a * d + c * b

q = b * d

 

Вычисляем НОД числителя и знаменателя. Сокращаем дробь.

 

g = math.gcd(p, q)

p //= g

q //= g

 

Выводим ответ. Если ответом является целое число (знаменатель q равен 1), то выводим только числитель.

 

if q == 1: print(p)

else: print(p, q)